home *** CD-ROM | disk | FTP | other *** search
/ AmigActive 10 / AACD 10.iso / AACD / Games / MAME / src / vidhrdw / tehkanwc.c < prev    next >
C/C++ Source or Header  |  2000-05-04  |  7KB  |  327 lines

  1. /***************************************************************************
  2.  
  3. Tehkan World Cup - (c) Tehkan 1985
  4.  
  5.  
  6. Ernesto Corvi
  7. ernesto@imagina.com
  8.  
  9. Roberto Juan Fresca
  10. robbiex@rocketmail.com
  11.  
  12. ***************************************************************************/
  13.  
  14. #include "driver.h"
  15. #include "vidhrdw/generic.h"
  16.  
  17. unsigned char *tehkanwc_videoram1;
  18. size_t tehkanwc_videoram1_size;
  19. static struct osd_bitmap *tmpbitmap1 = 0;
  20. static unsigned char *dirtybuffer1;
  21. static unsigned char scroll_x[2],scroll_y;
  22. static unsigned char led0,led1;
  23.  
  24.  
  25. int tehkanwc_vh_start(void)
  26. {
  27.     if (generic_vh_start())
  28.         return 1;
  29.  
  30.     if ((tmpbitmap1 = osd_new_bitmap(2 * Machine->drv->screen_width, Machine->drv->screen_height,Machine->scrbitmap->depth)) == 0)
  31.     {
  32.         generic_vh_stop();
  33.         return 1;
  34.     }
  35.  
  36.     if ((dirtybuffer1 = malloc(tehkanwc_videoram1_size)) == 0)
  37.     {
  38.         osd_free_bitmap(tmpbitmap1);
  39.         generic_vh_stop();
  40.         return 1;
  41.     }
  42.     memset(dirtybuffer1,1,tehkanwc_videoram1_size);
  43.  
  44.     return 0;
  45. }
  46.  
  47. void tehkanwc_vh_stop(void)
  48. {
  49.     free(dirtybuffer1);
  50.     osd_free_bitmap(tmpbitmap1);
  51.     generic_vh_stop();
  52. }
  53.  
  54.  
  55.  
  56. READ_HANDLER( tehkanwc_videoram1_r )
  57. {
  58.     return tehkanwc_videoram1[offset];
  59. }
  60.  
  61. WRITE_HANDLER( tehkanwc_videoram1_w )
  62. {
  63.     tehkanwc_videoram1[offset] = data;
  64.     dirtybuffer1[offset] = 1;
  65. }
  66.  
  67. READ_HANDLER( tehkanwc_scroll_x_r )
  68. {
  69.     return scroll_x[offset];
  70. }
  71.  
  72. READ_HANDLER( tehkanwc_scroll_y_r )
  73. {
  74.     return scroll_y;
  75. }
  76.  
  77. WRITE_HANDLER( tehkanwc_scroll_x_w )
  78. {
  79.     scroll_x[offset] = data;
  80. }
  81.  
  82. WRITE_HANDLER( tehkanwc_scroll_y_w )
  83. {
  84.     scroll_y = data;
  85. }
  86.  
  87.  
  88.  
  89. WRITE_HANDLER( gridiron_led0_w )
  90. {
  91.     led0 = data;
  92. }
  93. WRITE_HANDLER( gridiron_led1_w )
  94. {
  95.     led1 = data;
  96. }
  97.  
  98. /*
  99.    Gridiron Fight has a LED display on the control panel, to let each player
  100.    choose the formation without letting the other know.
  101.    We emulate it by showing a character on the corner of the screen; the
  102.    association between the bits of the port and the led segments is:
  103.  
  104.     ---0---
  105.    |       |
  106.    5       1
  107.    |       |
  108.     ---6---
  109.    |       |
  110.    4       2
  111.    |       |
  112.     ---3---
  113.  
  114.    bit 7 = enable (0 = display off)
  115.  */
  116.  
  117. static void gridiron_drawled(struct osd_bitmap *bitmap,unsigned char led,int player)
  118. {
  119.     int i;
  120.  
  121.  
  122.     static unsigned char ledvalues[] =
  123.             { 0x86, 0xdb, 0xcf, 0xe6, 0xed, 0xfd, 0x87, 0xff, 0xf3, 0xf1 };
  124.  
  125.  
  126.     if ((led & 0x80) == 0) return;
  127.  
  128.     for (i = 0;i < 10;i++)
  129.     {
  130.         if (led == ledvalues[i] ) break;
  131.     }
  132.  
  133.     if (i < 10)
  134.     {
  135.         if (player == 0)
  136.             drawgfx(bitmap,Machine->gfx[0],
  137.                     0xc0 + i,
  138.                     0x0a,
  139.                     0,0,
  140.                     0,232,
  141.                     &Machine->drv->visible_area,TRANSPARENCY_NONE,0);
  142.         else
  143.             drawgfx(bitmap,Machine->gfx[0],
  144.                     0xc0 + i,
  145.                     0x03,
  146.                     1,1,
  147.                     0,16,
  148.                     &Machine->drv->visible_area,TRANSPARENCY_NONE,0);
  149.     }
  150. else logerror("unknown LED %02x for player %d\n",led,player);
  151. }
  152.  
  153.  
  154.  
  155. void tehkanwc_vh_screenrefresh(struct osd_bitmap *bitmap,int full_refresh)
  156. {
  157.     int offs;
  158.  
  159. palette_init_used_colors();
  160.  
  161. {
  162.     int color,code,i;
  163.     int colmask[16];
  164.     int pal_base;
  165.  
  166.  
  167.     pal_base = Machine->drv->gfxdecodeinfo[2].color_codes_start;
  168.  
  169.     for (color = 0;color < 16;color++) colmask[color] = 0;
  170.  
  171.     for (offs = tehkanwc_videoram1_size - 2;offs >= 0;offs-=2)
  172.     {
  173.         code = tehkanwc_videoram1[offs] + ((tehkanwc_videoram1[offs+1] & 0x30) << 4);
  174.         color = tehkanwc_videoram1[offs+1] & 0x0f;
  175.  
  176.         colmask[color] |= Machine->gfx[2]->pen_usage[code];
  177.     }
  178.  
  179.     for (color = 0;color < 16;color++)
  180.     {
  181.         for (i = 0;i < 16;i++)
  182.         {
  183.             if (colmask[color] & (1 << i))
  184.                 palette_used_colors[pal_base + 16 * color + i] = PALETTE_COLOR_USED;
  185.         }
  186.     }
  187.  
  188.  
  189.     pal_base = Machine->drv->gfxdecodeinfo[1].color_codes_start;
  190.  
  191.     for (color = 0;color < 16;color++) colmask[color] = 0;
  192.  
  193.     for (offs = 0;offs < spriteram_size;offs += 4)
  194.     {
  195.         code = spriteram[offs+0] + ((spriteram[offs+1] & 0x08) << 5);
  196.         color = spriteram[offs+1] & 0x07;
  197.  
  198.         colmask[color] |= Machine->gfx[1]->pen_usage[code];
  199.     }
  200.  
  201.     for (color = 0;color < 16;color++)
  202.     {
  203.         if (colmask[color] & (1 << 0))
  204.             palette_used_colors[pal_base + 16 * color] = PALETTE_COLOR_TRANSPARENT;
  205.         for (i = 1;i < 16;i++)
  206.         {
  207.             if (colmask[color] & (1 << i))
  208.                 palette_used_colors[pal_base + 16 * color + i] = PALETTE_COLOR_USED;
  209.         }
  210.     }
  211.  
  212.  
  213.     pal_base = Machine->drv->gfxdecodeinfo[0].color_codes_start;
  214.  
  215.     for (color = 0;color < 16;color++) colmask[color] = 0;
  216.  
  217.     for (offs = videoram_size - 1;offs >= 0;offs--)
  218.     {
  219.         code = videoram[offs] + ((colorram[offs] & 0x10) << 4);
  220.         color = colorram[offs] & 0x0f;
  221.         colmask[color] |= Machine->gfx[0]->pen_usage[code];
  222.     }
  223.  
  224.     for (color = 0;color < 16;color++)
  225.     {
  226.         if (colmask[color] & (1 << 0))
  227.             palette_used_colors[pal_base + 16 * color] = PALETTE_COLOR_TRANSPARENT;
  228.         for (i = 1;i < 16;i++)
  229.         {
  230.             if (colmask[color] & (1 << i))
  231.                 palette_used_colors[pal_base + 16 * color + i] = PALETTE_COLOR_USED;
  232.         }
  233.     }
  234. }
  235.  
  236.     if ( palette_recalc() ) {
  237.         memset( dirtybuffer, 1, videoram_size );
  238.         memset( dirtybuffer1, 1, tehkanwc_videoram1_size );
  239.     }
  240.  
  241.  
  242.  
  243.     /* draw the background */
  244.     for (offs = tehkanwc_videoram1_size-2;offs >= 0;offs -= 2 )
  245.     {
  246.         if (dirtybuffer1[offs] || dirtybuffer1[offs + 1])
  247.         {
  248.             int sx,sy;
  249.  
  250.  
  251.             dirtybuffer1[offs] = dirtybuffer1[offs + 1] = 0;
  252.  
  253.             sx = offs % 64;
  254.             sy = offs / 64;
  255.  
  256.             drawgfx(tmpbitmap1,Machine->gfx[2],
  257.                     tehkanwc_videoram1[offs] + ((tehkanwc_videoram1[offs+1] & 0x30) << 4),
  258.                     tehkanwc_videoram1[offs+1] & 0x0f,
  259.                     tehkanwc_videoram1[offs+1] & 0x40, tehkanwc_videoram1[offs+1] & 0x80,
  260.                     sx*8,sy*8,
  261.                     0,TRANSPARENCY_NONE,0);
  262.         }
  263.     }
  264.     {
  265.         int scrolly = -scroll_y;
  266.         int scrollx = -(scroll_x[0] + 256 * scroll_x[1]);
  267.         copyscrollbitmap(bitmap,tmpbitmap1,1,&scrollx,1,&scrolly,&Machine->drv->visible_area,TRANSPARENCY_NONE,0);
  268.     }
  269.  
  270.  
  271.     /* draw the foreground chars which don't have priority over sprites */
  272.     for (offs = videoram_size - 1;offs >= 0;offs--)
  273.     {
  274.         int sx,sy;
  275.  
  276.  
  277.         dirtybuffer[offs] = 0;
  278.  
  279.         sx = offs % 32;
  280.         sy = offs / 32;
  281.  
  282.         if ((colorram[offs] & 0x20))
  283.             drawgfx(bitmap,Machine->gfx[0],
  284.                     videoram[offs] + ((colorram[offs] & 0x10) << 4),
  285.                     colorram[offs] & 0x0f,
  286.                     colorram[offs] & 0x40, colorram[offs] & 0x80,
  287.                     sx*8,sy*8,
  288.                     &Machine->drv->visible_area,TRANSPARENCY_PEN,0);
  289.     }
  290.  
  291.  
  292.     /* draw sprites */
  293.     for (offs = 0;offs < spriteram_size;offs += 4)
  294.     {
  295.         drawgfx(bitmap,Machine->gfx[1],
  296.                 spriteram[offs+0] + ((spriteram[offs+1] & 0x08) << 5),
  297.                 spriteram[offs+1] & 0x07,
  298.                 spriteram[offs+1] & 0x40,spriteram[offs+1] & 0x80,
  299.                 spriteram[offs+2] + ((spriteram[offs+1] & 0x20) << 3) - 0x80,spriteram[offs+3],
  300.                 &Machine->drv->visible_area,TRANSPARENCY_PEN,0);
  301.     }
  302.  
  303.  
  304.     /* draw the foreground chars which have priority over sprites */
  305.     for (offs = videoram_size - 1;offs >= 0;offs--)
  306.     {
  307.         int sx,sy;
  308.  
  309.  
  310.         dirtybuffer[offs] = 0;
  311.  
  312.         sx = offs % 32;
  313.         sy = offs / 32;
  314.  
  315.         if (!(colorram[offs] & 0x20))
  316.             drawgfx(bitmap,Machine->gfx[0],
  317.                     videoram[offs] + ((colorram[offs] & 0x10) << 4),
  318.                     colorram[offs] & 0x0f,
  319.                     colorram[offs] & 0x40, colorram[offs] & 0x80,
  320.                     sx*8,sy*8,
  321.                     &Machine->drv->visible_area,TRANSPARENCY_PEN,0);
  322.     }
  323.  
  324.     gridiron_drawled(bitmap,led0,0);
  325.     gridiron_drawled(bitmap,led1,1);
  326. }
  327.